package com.smartinput.voice.config

import com.smartinput.voice.application.service.VoiceRecognitionTestService
import org.slf4j.LoggerFactory
import org.springframework.boot.ApplicationArguments
import org.springframework.boot.ApplicationRunner
import org.springframework.stereotype.Component
import java.io.File
import java.util.*

/**
 * 自动测试运行器 - 在应用启动后自动执行语音识别测试
 */
// @Component
class AutoTestRunner(
    private val voiceTestService: VoiceRecognitionTestService
) : ApplicationRunner {
    
    private val logger = LoggerFactory.getLogger(AutoTestRunner::class.java)
    
    override fun run(args: ApplicationArguments?) {
        logger.info("🚀 应用启动完成，准备执行自动测试...")
        
        // 延迟5秒执行测试，确保所有服务都已完全启动
        val timer = Timer("AutoTestTimer", false)
        timer.schedule(object : TimerTask() {
            override fun run() {
                try {
                    runAutoTest()
                } catch (e: Exception) {
                    logger.error("自动测试执行失败", e)
                } finally {
                    // 取消定时器，只执行一次
                    timer.cancel()
                }
            }
        }, 5000L)
    }
    
    private fun runAutoTest() {
        logger.info("🎯 开始执行自动语音识别测试...")
        
        val testAudioFile = "scripts/test-audio/test.wav"
        val testTextFile = "scripts/test-audio/test.txt"
        
        // 检查测试文件是否存在
        val audioFile = File(testAudioFile)
        val textFile = File(testTextFile)
        
        if (!audioFile.exists()) {
            logger.warn("⚠️ 测试音频文件不存在: $testAudioFile")
            return
        }
        
        // 读取期望文本（如果存在）
        val expectedText = if (textFile.exists()) {
            try {
                textFile.readText().trim()
            } catch (e: Exception) {
                logger.warn("读取期望文本失败: ${e.message}")
                ""
            }
        } else {
            logger.info("未找到期望文本文件，将进行纯音频识别测试")
            ""
        }
        
        // 配置测试参数
        val testConfig = VoiceRecognitionTestService.TestConfig(
            audioFile = audioFile.absolutePath,
            expectedText = expectedText,
            chunkSize = 3200,           // 使用标准包大小
            intervalMs = 200,           // 200ms间隔发送
            timeoutSeconds = 30         // 30秒超时
        )
        
        logger.info("📝 测试配置:")
        logger.info("   音频文件: ${testConfig.audioFile}")
        logger.info("   期望文本: ${if (expectedText.isNotEmpty()) expectedText else "无（纯识别测试）"}")
        logger.info("   包大小: ${testConfig.chunkSize} bytes")
        logger.info("   发送间隔: ${testConfig.intervalMs} ms")
        logger.info("   超时时间: ${testConfig.timeoutSeconds} 秒")
        
        try {
            // 执行测试
            val result = voiceTestService.runSingleTest(testConfig)
            
            // 输出测试结果
            logger.info("🎉 自动测试完成!")
            logger.info("=" * 60)
            logger.info("📊 测试结果报告:")
            logger.info("   测试ID: ${result.testId}")
            logger.info("   音频文件: ${result.audioFile}")
            logger.info("   音频大小: ${result.audioSize} bytes")
            logger.info("   音频长度: ${"%.2f".format(result.audioLength)} 秒")
            logger.info("   执行时间: ${result.duration} ms")
            logger.info("   识别结果: ${result.actualText}")
            
            if (result.expectedText.isNotEmpty()) {
                logger.info("   期望文本: ${result.expectedText}")
                logger.info("   匹配度: ${"%.2f".format(result.confidence * 100)}%")
            }
            
            logger.info("   测试状态: ${if (result.success) "✅ 成功" else "❌ 失败"}")
            
            if (result.errorMessage != null) {
                logger.error("   错误信息: ${result.errorMessage}")
            }
            
            logger.info("=" * 60)
            
            // 根据结果给出建议
            if (result.success) {
                logger.info("🎊 恭喜！语音识别功能正常工作")
                if (result.actualText.isNotEmpty()) {
                    logger.info("💡 识别到的文本内容: \"${result.actualText}\"")
                }
            } else {
                logger.warn("⚠️ 语音识别测试失败，请检查:")
                logger.warn("   1. 阿里云WebSocket连接是否正常")
                logger.warn("   2. Token是否有效")
                logger.warn("   3. 音频格式是否正确（16KHz, 16bit, mono PCM）")
                logger.warn("   4. 网络连接是否稳定")
                
                if (result.errorMessage != null) {
                    logger.warn("   详细错误: ${result.errorMessage}")
                }
            }
            
        } catch (e: Exception) {
            logger.error("🚨 自动测试执行过程中发生异常", e)
            logger.error("请检查系统配置和日志以获取更多信息")
        }
    }
    
    companion object {
        private operator fun String.times(n: Int): String = this.repeat(n)
    }
}
